package br.com.sgbl.dao;

import br.com.sgbl.bean.Estoque;
import br.com.sgbl.bean.Funcionario;
import br.com.sgbl.bean.ItemPedido;
import br.com.sgbl.bean.Pedido;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Leandro
 */
public class ItemPedidoDao {

    private static final String SQL_LISTAR_ITENS_POR_SETOR =
            "SELECT * FROM ITEM_PEDIDO";
    private static final String SQL_LISTAR_POR_PEDIDO =
            "SELECT * "
            + "FROM ITEM_PEDIDO WHERE fk_pedido_id = ?";
    private static final String SQL_INSERIR =
            "INSERT INTO item_pedido (total, preco, quantidade, status_item, fk_estoque_id, fk_pedido_id) VALUES (?,?,?,?,?,?)";
    private static final String SQL_EXCLUIR =
            "DELETE FROM ITEM_PEDIDO WHERE fk_pedido_id = ?";
    private static final String SQL_ALTERAR_EM_ATENDIMENTO =
            "UPDATE ITEM_PEDIDO SET STATUS_ITEM = ?, FK_FUNCIONARIO_ATENDIMENTO_ID = ? where fk_pedido_id = ? and fk_estoque_id = ?";

    public List listar(Connection conn, long codigo) throws SQLException {
        List lista = new ArrayList();

        PreparedStatement ps = conn.prepareStatement(SQL_LISTAR_POR_PEDIDO);
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            ItemPedido itemPedido = new ItemPedido();
            itemPedido.setTotal(rs.getDouble("total"));
            itemPedido.setPreco(rs.getDouble("preco"));
            itemPedido.setQuantidade(rs.getInt("quantidade"));
            itemPedido.setStatus(rs.getString("status_item"));

            EstoqueDao estoqueDao = new EstoqueDao();
            Estoque estoque = estoqueDao.localizar(conn, rs.getLong("fk_estoque_id"));
            itemPedido.setEstoque(estoque);

            PedidoDao pedidoDao = new PedidoDao();
            Pedido pedido = pedidoDao.localizar(conn, rs.getLong("fk_pedido_id"));
            itemPedido.setPedido(pedido);

            lista.add(itemPedido);
        }
        return lista;
    }

    public List listarSetorCozinha() throws SQLException {
        List lista = new ArrayList();
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR_ITENS_POR_SETOR);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                ItemPedido itemPedido = new ItemPedido();
                itemPedido.setTotal(rs.getDouble("total"));
                itemPedido.setPreco(rs.getDouble("preco"));
                itemPedido.setQuantidade(rs.getInt("quantidade"));
                itemPedido.setStatus(rs.getString("status_item"));

                EstoqueDao estoqueDao = new EstoqueDao();
                Estoque estoque = estoqueDao.localizar(conn, rs.getLong("fk_estoque_id"));
                itemPedido.setEstoque(estoque);

                PedidoDao pedidoDao = new PedidoDao();
                Pedido pedido = pedidoDao.localizar(conn, rs.getLong("fk_pedido_id"));
                itemPedido.setPedido(pedido);
                
                FuncionarioDao funcionarioDao = new FuncionarioDao();
                Funcionario funcionario = funcionarioDao.localizar(conn, rs.getLong("fk_funcionario_atendimento_id"));
                itemPedido.setFuncionarioAtendimento(funcionario);

                if(itemPedido.getEstoque().getProduto().getSetor().getDescricao().equals("Cozinha")) {
                    lista.add(itemPedido);
                }
            }
        } finally {
            conn.close();
        }
        return lista;
    }

    public List listarSetorBebidas() throws SQLException {
        List lista = new ArrayList();
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR_ITENS_POR_SETOR);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                ItemPedido itemPedido = new ItemPedido();
                itemPedido.setTotal(rs.getDouble("total"));
                itemPedido.setPreco(rs.getDouble("preco"));
                itemPedido.setQuantidade(rs.getInt("quantidade"));
                itemPedido.setStatus(rs.getString("status_item"));

                EstoqueDao estoqueDao = new EstoqueDao();
                Estoque estoque = estoqueDao.localizar(conn, rs.getLong("fk_estoque_id"));
                itemPedido.setEstoque(estoque);

                PedidoDao pedidoDao = new PedidoDao();
                Pedido pedido = pedidoDao.localizar(conn, rs.getLong("fk_pedido_id"));
                itemPedido.setPedido(pedido);
                
                FuncionarioDao funcionarioDao = new FuncionarioDao();
                Funcionario funcionario = funcionarioDao.localizar(conn, rs.getLong("fk_funcionario_atendimento_id"));
                itemPedido.setFuncionarioAtendimento(funcionario);

                lista.add(itemPedido);
            }
        } finally {
            conn.close();
        }
        return lista;
    }

    public List inserirLista(Connection conn, long pedidoId, List itens)
            throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_INSERIR);

        for (int i = 0; i < itens.size(); i++) {
            ItemPedido itemPedido = (ItemPedido) itens.get(i);
            itemPedido.setStatus(ItemPedido.NAO_ATENDIDO);

            ps.clearParameters();
            ps.setDouble(1, itemPedido.getTotal());
            ps.setDouble(2, itemPedido.getPreco());
            ps.setInt(3, itemPedido.getQuantidade());
            ps.setString(4, itemPedido.getStatus());
            ps.setLong(5, itemPedido.getEstoque().getId());
            ps.setLong(6, pedidoId);

            ps.executeUpdate();

            conn.commit();
        }

        return itens;
    }

    public void excluir(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);
        ps.setLong(1, codigo);

        ps.executeUpdate();
    }
    
    public void itemEmAtendimento(ItemPedido itemPedido) throws SQLException {
        Connection conn = Conexao.getConnection();
        
        PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR_EM_ATENDIMENTO);
        ps.setString(1, ItemPedido.EM_ATENDIMENTO);
        ps.setLong(2, itemPedido.getFuncionarioAtendimento().getId());
        ps.setLong(3, itemPedido.getPedido().getId());
        ps.setLong(4, itemPedido.getEstoque().getId());
        
        ps.executeUpdate();
    }
}
